package main

/**
方法的值传递和引用传递

go函数不支持重载
*/

import (
	"fmt"
	"mytest/main/mytest"
	"unsafe"
)

func main() {
	fmt.Println("Hello World!")
	/* 变量赋值 */
	var a int = 5
	fmt.Println("==方法外部a1:(基本数据类型)==", a)
	funcTestBasic(a)
	fmt.Println("==方法外部a2:(基本数据类型)==", a)

	fmt.Println("==方法外部a1:(基本数据类型)==", a)
	funcTestRef(&a)
	fmt.Println("==方法外部a2:(基本数据类型)==", a)

	/* 把函数赋值给一个变量 */
	var myFunc = funcTestRef
	var b = 20
	fmt.Println("==方法外部b:(基本数据类型)==", b)
	myFunc(&b)
	fmt.Println("==方法外部b:(基本数据类型)==", b)
	/* 方法的参数还能是方法 */
	funcTestParam(myFunc, &b)

	/* 调用方法(外部) */
	mytest.SayHelloTest()

	fmt.Println("==给类型起别名==")
	type MyInt int
	var c MyInt = 200
	fmt.Println("==c==", c, "类型别名:", unsafe.Sizeof(c))

	fmt.Println("==函数的参数为可变参数==")
	funcVarParam(10, 20, 30)
}

/*
*
参数类型为可变参数
*/
func funcVarParam(temp ...int) {
	fmt.Println("==方法内容:==参数值为:", temp, "==内存地址==", &temp)
	for i := 0; i < len(temp); i++ {
		fmt.Println("==方法内容:==参数值为:", temp[i], "==内存地址==", &temp[i])
	}
}

/*
当前文件内部调用
*/
func funcTestBasic(a int) {
	a = 10
	fmt.Println("==方法内部a:==", a)
}

/*
当前文件内部调用
*/
func funcTestRef(a *int) {
	*a = *a + 10
	fmt.Println("==方法内部a:==", *a)
}

/*
当前文件内部调用
参数1:是一个函数,
参数2:是一个指针类型变量,第一个函数要用到的
*/
func funcTestParam(a func(*int), b *int) {
	a(b)
	fmt.Println("==方法内部(参数是方法):==", *b)
}

/* 返回值有多个参数 */
